//
//  WBStatusViewModel.swift
//  仿写微博
//
//  Created by tuimao on 17/7/25.
//  Copyright © 2017年 tuimao. All rights reserved.
//

import Foundation

class WBStatusViewModel:CustomStringConvertible{
    //模型
    var status:WBStatus
    //会员图标处理
    var memberIcon:UIImage?
    //vip图标
    var vipIcon:UIImage?
    /// 转发
    var retweetedStr:String?
    /// 评论
    var commentStr:String?
    ///赞
    var likeStr:String?
    //配图view的尺寸
    var pictureViewSize:CGSize = CGSize()
    ///正文的文字
    var statusAttrText:NSAttributedString?
    /// 被转发微博的文字
    var retweetedAttrText:NSAttributedString?
    //是否是转发微博的图片
    var picURLs:[WBStatusPicture]?{
        return status.retweeted_status?.pic_urls ?? status.pic_urls
    }
    //来源label
    var sourceStr:String?
    
    //行高
    var rowHeight:CGFloat = 0
    //构造函数
    init(model:WBStatus) {
        status = model
        guard let user = model.user else {
            return
        }
        //会员图标处理
        if user.mbrank > 0 && user.mbrank < 7{
            memberIcon = UIImage(named: "common_icon_membership_level\(user.mbrank)")
        }  
        //认证图标处理
        switch user.verified_type {
        case 0:
            vipIcon = UIImage(named: "avatar_vip")
        case 2,3,5:
            vipIcon = UIImage(named: "avatar_enterprise_vip")
        case 220:
            vipIcon = UIImage(named: "avatar_grassroot")
        default:
            break
        }
        //转发、评论、赞的数据处理
        retweetedStr = countString(count: model.reposts_count, defaultStr: "转发")
        commentStr = countString(count: model.comments_count, defaultStr: "评论")
        likeStr = countString(count: model.attitudes_count, defaultStr: "赞")
        //计算配图大小
        pictureViewSize = calcPictureViewSize(count: picURLs?.count)
        //正文字体大小
        let statusTextFont = UIFont.systemFont(ofSize: 15)
        //转发微博的字体大小
        let retweetTextFont = UIFont.systemFont(ofSize: 14)
        //设置被转发微博的文字
        let rText = "@" + (status.retweeted_status?.user?.screen_name ?? "") + ":" + (status.retweeted_status?.text ?? "")
        retweetedAttrText = CZEmoticonManager.shared.emoticonString(string: rText, font: retweetTextFont)
        //设置正文
        statusAttrText = CZEmoticonManager.shared.emoticonString(string: model.text ?? "", font: statusTextFont)
        //行高的计算
        updateRowHeight()
        //处理来源的label
        sourceStr = "来自" + (model.source?.cz_href()?.text ?? "")
    }
    
    //MARK:计算cell的高度
    private func updateRowHeight(){
        //边距
        let margin:CGFloat = 12
        //头像高度
        let iconHeight:CGFloat = 34
        //工具栏高度
        let toolbarHeight:CGFloat = 35
        //总高度
        var height:CGFloat = 0
        //1.顶部高度
        height += 2 * margin + iconHeight + margin + margin
        //文字大小
        let viewsize = CGSize(width: UIScreen.cz_screenWidth() - 2 * margin, height: CGFloat(MAXFLOAT))
        //2.正文的高度
        if let text = statusAttrText {
            //原文的文字高度,文字高度尽量大
           height += text.boundingRect(with: viewsize, options: [.usesLineFragmentOrigin], context: nil).height
        }
        //3.是否是转发微博
        if status.retweeted_status != nil {
            height += 2 * margin
            if let text = retweetedAttrText {
                height += text.boundingRect(with: viewsize, options: [.usesLineFragmentOrigin], context: nil).height
            }
        }
        //4.配图视图
        height += pictureViewSize.height + margin
        //工具栏
        height += toolbarHeight
        //赋值
        rowHeight = height
    }
    
    /// 使用单个图像，更新配图视图的大小
    ///
    /// 新浪针对单张图片，都是缩略图，但是偶尔会有一张特别大的图 7000 * 9000 多
    /// 新浪微博，为了鼓励原创，支持`长微博`，但是有的时候，有特别长的微博，长到宽度只有1个点
    ///
    /// - parameter image: 网路缓存的单张图像
     func updateSingleImageSize(image:UIImage){
        var size = image.size
        
        let maxWidth: CGFloat = 200
        let minWidth: CGFloat = 40
        
        // 过宽图像处理
        if size.width > maxWidth {
            // 设置最大宽度
            size.width = 200
            // 等比例调整高度
            size.height = size.width * image.size.height / image.size.width
        }
        
        // 过窄图像处理
        if size.width < minWidth {
            size.width = minWidth
            
            // 要特殊处理高度，否则高度太大，会印象用户体验
            size.height = size.width * image.size.height / image.size.width / 4
        }
        
        // 过高图片处理，图片填充模式就是 scaleToFill，高度减小，会自动裁切
        if size.height > 200 {
            size.height = 200
        }
        
        // 特例：有些图像，本身就是很窄，很长！-> 定义一个 minHeight，思路同上！
        // 在工作中，如果看到代码中有些疑惑的分支处理！千万不要动！
        
        // 注意，尺寸需要增加顶部的 12 个点，便于布局
        size.height += WBStatusPictureOutterMargin
        
        // 重新设置配图视图大小
        pictureViewSize = size
        
        // 更新行高
        updateRowHeight()
    }
    
    /// 根据图片数量确定pictureView的大小
    ///
    /// - Parameter count: 数字
    /// - Returns: 配图视图大小
    private func calcPictureViewSize(count:Int?)-> CGSize{
        //是否有配图
        if count == 0 || count == nil{
            return CGSize()
        }
        //行数
        let row = (count! - 1) / 3 + 1
        //总高度
        let height = WBStatusPictureOutterMargin + CGFloat(row) * WBStatusPictureItemWidth + CGFloat(row - 1) * WBStatusPictureInnerMargin
       return CGSize(width: WBStatusPictureViewWidth, height: height)
    }
    /// 给cell上工具条显示处理数据
    ///
    /// - Parameters:
    ///   - count: 数量
    ///   - defaultStr: 默认
    /// - Returns: 处理过的字符串
    private func countString(count:Int,defaultStr:String)->String{
        if count == 0 {
            return defaultStr
        }
        
        if count < 10000{
            return count.description
        }
        return String(format: "%0.2f 万", Double(count) / 10000)
    }
    
    var description: String{
        return status.description
    }
}
